/*
 * ConversorDERaClases.h
 *
 *  Created on: May 27, 2013
 *      Author: root
 */

#ifndef CONVERSORDERACLASES_H_
#define CONVERSORDERACLASES_H_

#include "gui/VisualComponents/clases/VisualClassComponentClase.h"
#include "gui/VisualComponents/der/VisualComponentEntity.h"
#include "gui/VisualComponents/der/VisualComponentRelation.h"
#include "model/der/Entity.h"
#include "model/clases/Clase.h"
#include "gui/SubWindow/WorkspaceDER.h"
#include "gui/SubWindow/WorkspaceClases.h"
#include <map>

class ConversorDERaClasesDelegate;

class ConversorDERaClases {

public:
	ConversorDERaClases(WorkspaceDER *workspaceDERaConvertir, ConversorDERaClasesDelegate *delegate);
	void convertir();
	virtual ~ConversorDERaClases();

	bool generarGettersYSetters;



private:
	WorkspaceDER *_workspaceDERaConvertir;
	WorkspaceClases *_workspaceClasesConvertidoDesdeDER;
	ConversorDERaClasesDelegate *_delegate;
	std::map<Entity *, Clase *> _mapeoClasesParaEntidades;
	std::map<Relation *, Clase *> _mapeoClasesParaRelaciones;


	VisualClassComponentClase *convertirEntidad(VisualComponentEntity *vistaDeEntidad);
	VisualClassComponentClase *convertirRelacionAClase(VisualComponentRelation *vistaDeRelacion);
	Atributo *convertirAtributo(Attribute *atributo, std::string tipoDeDato);
	std::vector<Atributo *> convertirAtributos(std::vector<Attribute *> atributo);

	VisualClassComponentClase *convertirAtributoCompuesto(CompositeAttribute *atributoCompuesto);
	std::vector<Atributo *> convertirAtributosCompuestos(std::vector<CompositeAttribute *> atributoCompuesto, Entity *entidad, VisualClassComponentClase *vistaDeLaClaseQueRepresentaLaEntidad);
	std::vector<Atributo *> convertirAtributosCompuestos(std::vector<CompositeAttribute *> atributoCompuesto, Relation *relacion, VisualClassComponentClase *vistaDeLaClaseQueRepresentaLaRelacion);

	void generarGettersYSettersParaClase(Clase *clase);
	Metodo *generarGetterParaAtributo(Atributo *atributo);
	Metodo *generarSetterParaAtributo(Atributo *atributo);

	Diagram *getDiagramaDER() {
		return _workspaceDERaConvertir->getDiagram();
	}

	Diagram *getDiagramaClases() {
		return _workspaceClasesConvertidoDesdeDER->getDiagram();
	}
};



//typedef enum ConversorDERaClasesOpcionNavegabilidadUnoAEne {
//	ConversorDERaClasesOpcionNavegabilidadUnoAEneNoDefinido = 0,
//	ConversorDERaClasesOpcionNavegabilidadUnoAEneIdaYVuelta,
//	ConversorDERaClasesOpcionNavegabilidadUnoAEneUnoConoceAMuchos,
//	ConversorDERaClasesOpcionNavegabilidadUnoAEneMuchosConocenAUno,
//} ConversorDERaClasesOpcionNavegabilidadUnoAEne;
//
//typedef enum ConversorDERaClasesOpcionTipoUnoAEne {
//	ConversorDERaClasesOpcionTipoUnoAEneNoDefinido = 0,
//	ConversorDERaClasesOpcionTipoUnoAEneAgregacion,
//	ConversorDERaClasesOpcionTipoUnoAEneComposicion,
//} ConversorDERaClasesOpcionTipoUnoAEne;
//
//typedef enum ConversorDERaClasesOpcionNavegabilidadEneAEne {
//	ConversorDERaClasesOpcionNavegabilidadEneAEneNoDefinido = 0,
//	ConversorDERaClasesOpcionNavegabilidadEneAEneIdaYVuelta, // ?
//	ConversorDERaClasesOpcionNavegabilidadEneAEneUnoConoceAMuchos, // ?
//	ConversorDERaClasesOpcionNavegabilidadEneAEneMuchosConocenAUno, // ?
//} ConversorDERaClasesOpcionNavegabilidadEneAEne;
//
//typedef enum ConversorDERaClasesOpcionTipoEneAEne {
//	ConversorDERaClasesOpcionTipoEneAEneNoDefinido = 0,
//	ConversorDERaClasesOpcionTipoEneAEneAgregacion,
//	ConversorDERaClasesOpcionTipoEneAEneComposicion,
//} ConversorDERaClasesOpcionTipoEneAEne;

class ConversorDERaClasesDelegate {
public:
//	virtual ConversorDERaClasesOpcionNavegabilidadEneAEne opcionDeNavegabilidadEneAEneParaClases(Clase *clase1, Clase *clase2) {} ;
//	virtual ConversorDERaClasesOpcionTipoEneAEne opcionDeTipoEneAEneParaClases(Clase *clase1, Clase *clase2) {} ;
//
//	virtual ConversorDERaClasesOpcionNavegabilidadUnoAEne opcionDeNavegabilidadUnoAEneParaClases(Clase *claseEne, Clase *claseUno) {};
//	virtual ConversorDERaClasesOpcionTipoUnoAEne opcionDeTipoUnoAEneParaClases(Clase *claseEne, Clase *claseUno) {};

	virtual void conversorDERaClasesTerminoConversion(WorkspaceClases *workspaceConvertido) {};

};

struct ConexionEntreEntidades {
	Entity *entidad1;
	Entity *entidad2;
	Relation *relacion;
};

#endif /* CONVERSORDERACLASES_H_ */
